#ifndef AU_FEATURETERM
#define AU_FEATURETERM

#define AU_VERSION_FAST			0
#define AU_VERSION_STANDARD		1
#define AU_VERSION_COMPLETE		2

FeatureTerm *simple_antiunification(FeatureTerm *f1,FeatureTerm *f2,Ontology *ontology,FTKBase *domain_model);

void antiunification(List<FeatureTerm> *result,
					List<FeatureTerm> *objects,int specialization_language,List<FeatureTerm> *initial_terms,Ontology *ontology,
					FTKBase *domain_model,bool check_separability,int version);
void antiunification(List<FeatureTerm> *result,List<int> *result_steps,
					 List<FeatureTerm> *objects,int specialization_language,List<FeatureTerm> *initial_terms,Ontology *ontology,
					 FTKBase *domain_model,bool check_separability,int version);
void antiunification_progressive(List<FeatureTerm> *result,
								 List<FeatureTerm> *objects,int specialization_language,List<FeatureTerm> *initial_terms,Ontology *ontology,
								 FTKBase *domain_model,bool check_separability,int version);

int specializationLanguageRequired(FeatureTerm *ft,FTKBase *domain_model);

void path_intersection(List<Path> *pa1,List<Path> *pa2,
 	 				   List<Path> *pb1,List<Path> *pb2);

bool separable_feature(Symbol *fname,List<FeatureTerm> *objects,FTKBase *domain_model);


#endif
